#!/bin/sh
BIN_NAME="vpnportald"
MOD_NAME="vpnportal"

DIR_VPNPORTAL="/opt/vpnportal"
OVPN_INIT="$DIR_VPNPORTAL/etc/init.ovpn"
VPN_CHAIN_INTERNET_IN="iint_vpnportal"
VPN_CHAIN_INTERNET_OUT="oint_vpnportal"
VPN_CHAIN_FWD="FORWARD"
VPN_CHAIN_IN="INPUT"
VPN_CHAIN_OUT="OUTPUT"
VPN_TABLE_FILTER="filter"

ipt4_chain_exists() {
  local table=$1
  local chain=$2
  eval "iptables -t $table -L $chain -w 2>/dev/null 1>/dev/null"
}

ipt4_rule_exists() {
  local table=$1
  local chain=$2
  local rule=$3  
  eval "iptables -t $table -C $chain $rule -w 2>/dev/null 1>/dev/null"
}

ipt4_flush_chain_force() {
  local table=$1
  local chain=$2
  if ! ipt4_chain_exists "$table" "$chain"; then
    return 0
  fi
  eval "iptables -t $table -F $chain -w"
}

ipt4_delete_chain_force() {
  local table=$1
  local chain=$2
  if ! ipt4_chain_exists "$table" "$chain"; then
    return 0
  fi
  eval "iptables -t $table -X $chain -w"
}

ipt4_delete_rule_force() {
  local table=$1
  local chain=$2
  local rule=$3
  if ! ipt4_rule_exists "$table" "$chain" "$rule"; then
    return 0
  fi
  eval "iptables -t $table -D $chain $rule -w"
}

ipt4_clean_internet_chains() {
  ipt4_flush_chain_force "$VPN_TABLE_FILTER" "$VPN_CHAIN_INTERNET_IN" 
  ipt4_flush_chain_force "$VPN_TABLE_FILTER" "$VPN_CHAIN_INTERNET_OUT" 
  ipt4_delete_rule_force "$VPN_TABLE_FILTER" "$VPN_CHAIN_IN" "-j $VPN_CHAIN_INTERNET_IN"
  ipt4_delete_rule_force "$VPN_TABLE_FILTER" "$VPN_CHAIN_OUT" "-j $VPN_CHAIN_INTERNET_OUT"
  ipt4_delete_rule_force "$VPN_TABLE_FILTER" "$VPN_CHAIN_FWD" "-j $VPN_CHAIN_INTERNET_IN"
  ipt4_delete_rule_force "$VPN_TABLE_FILTER" "$VPN_CHAIN_FWD" "-j $VPN_CHAIN_INTERNET_OUT"
  ipt4_delete_chain_force "$VPN_TABLE_FILTER" "$VPN_CHAIN_INTERNET_IN"
  ipt4_delete_chain_force "$VPN_TABLE_FILTER" "$VPN_CHAIN_INTERNET_OUT"
}

case "$1" in
  start|restart)
        . /opt/$MOD_NAME/etc/settings
        if [ "$1" = "restart" ]; then
            $OVPN_INIT "stop"
            echo -n "Restarting module $MOD_NAME: "
            killall $BIN_NAME 2> /dev/null
            ipt4_clean_internet_chains;
        else
            echo -n "Starting module $MOD_NAME: "
        fi
        if [ "$MOD_VPNPORTAL_ENABLED" != "1" ]; then
            echo "skipped"
            exit 0
        fi

        /opt/$MOD_NAME/bin/$BIN_NAME
        wait $!
        RETVAL=$?
        if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
        exit $RETVAL
        ;;
  stop)
        $OVPN_INIT "stop"
        echo -n "Stopping module $MOD_NAME: "
        killall $BIN_NAME 2> /dev/null
        RETVAL=$?
        if [ $RETVAL = 0 ]; then 
          iptables -t nat -F pre_vpnportal 2>/dev/null;
          ipt4_clean_internet_chains;
          echo "done"; 
        else 
          echo "failed"; 
        fi
        exit $RETVAL
        ;;
  status)
        echo -n "Module $MOD_NAME is "
        killall -0 $BIN_NAME 2> /dev/null
        RETVAL=$?
        if [ $RETVAL = 0 ]; then echo "running"; else echo "stopped"; fi
        exit $RETVAL
        ;;
  defaults)
        cp /opt/$MOD_NAME/etc/defaults /opt/$MOD_NAME/etc/settings 2> /dev/null
        cp /opt/$MOD_NAME/etc/defaults.ovpn /opt/$MOD_NAME/etc/settings.ovpn 2> /dev/null
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|status|defaults}"
        exit 1
esac
